GuardDutyの結果をSNSで通知する #reinvent
はじめに
Amazon GuardDuty はAmazon CloudWatch Eventsに基づいて通知を送信します。
ClodWatch EventsでLambdaを起動し、SNSにpublishしてみました。
SNSトピックの作成
東京リージョンに"sns-test"トピックを作成します。
サブスクリプションには、メールアドレスを登録しました。
Lambda関数の作成
ランタイムはPython 3.6を利用します。
eventデータをそのままsns-testトピックにpublishします。
関数名はGuardDutytoSNSとしました。
import json import boto3 def lambda_handler(event, context): client = boto3.client('sns') response = client.publish( TopicArn='arn:aws:sns:ap-northeast-1:Account-ID:sns-test', Message=json.dumps({'default': json.dumps(event)}), MessageStructure='json', Subject='guardduty' )
LambdaのIAMロールには、AWSLambdaExecuteポリシー、AmazonSNSFullAccessポリシーを設定しました。
CloudWatch Eventsルールの作成
CloudWatchイベントルールを作成します。
ソースにguarddutyを指定します。
$ aws events put-rule --name GuardDuty-Publisher --event-pattern '{"source":["aws.guardduty"]}'
イベントルールとラムダ関数を関連づけます。
$ aws events put-targets --rule GuardDuty-Publisher --targets Id=1,Arn=arn:aws:lambda:ap-northeast-1:Account-ID:function:GuardDutytoSNS
ターゲットを呼び出す上で必要なアクセス許可を追加します。
$ aws lambda add-permission --function-name GuardDutytoSNS --statement-id 1 --action 'lambda:InvokeFunction' --principal events.amazonaws.com
通知の確認
GuardDutyコンソール>全般>結果サンプルの生成 を選択します。
以下のようにJSON形式で、SNSに設定したメールアドレスに通知されました。
おわりに
Amazon GuardDuty はAmazon CloudWatch Eventsに基づいて通知を送信します。
ClodWatch EventsでLambdaを起動し、Amazon SNSにpublishしてみました。
今回はメール通知を行いましたが、SNSに対応するサードパーティと連携すればより便利かもしれません。